【测试】Selenium的使用(常用属性方法、元素等待、操作cookie、操作元素、无头模式、获取HTML源码)

您所在的位置:网站首页 fedex取件码 翻译 pickup number 【测试】Selenium的使用(常用属性方法、元素等待、操作cookie、操作元素、无头模式、获取HTML源码)

【测试】Selenium的使用(常用属性方法、元素等待、操作cookie、操作元素、无头模式、获取HTML源码)

2023-02-20 22:16| 来源: 网络整理| 查看: 265

1.Selenium

Selenium是一个用于Web应用程序测试的工具,可以使用代码控制浏览器,所以一般可以用于测试、爬虫等方向

免费开源跨平台,支持Linux、Win、Mac等支持多种浏览器,Chrome、Firefox、Edge等支持python、Java、C#、js等多种语言 2.WebDriver

Selenium不能直接控制浏览器,得经过webdriver才能与预览器交互,即webdriver是两者之间的桥梁。所以我们需要先下载webdriver

Chrom浏览器(chromedriver.exe): http://chromedriver.storage.googleapis.com/index.html

Firefox浏览器(geckodriver.exe): https://github.com/mozilla/geckodriver/tags

Edge浏览器: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Safari浏览器: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

因为Chrome浏览器太占资源了,所以我这里下载的是Firefox的驱动

下载的时候要注意版本适配,比如说旧的Driver可能无法控制新版的浏览器,如果不确定,那就把浏览器和Drive都更新到最新版本

下载完之后,为了不用每次都指定Driver的路径,我们可以把Drive添加到环境变量中,可以新建一个环境变量,嫌麻烦的话,直接把Driver复制到python的根目录

3.简单使用

当然,我们使用的语言是Python,所以应该先安装Selenium(Python版本应该在3.5或以上)

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

简单使用,执行下面的代码如果能控制浏览器,说明环境配置没问题

from selenium.webdriver import Firefox import time# driver = Firefox(executable_path=r"D:\kaifa\Python\Python36\geckodriver.exe") # 指定driver所在路径 driver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com") time.sleep(2) driver.quit() 4.元素定位

元素定位主要是xpath和css两种方式,关于元素定位,可以参考之前的文章 【爬虫】元素定位(xpath、css)

方法说明driver.find_element_by_id()通过id属性定位driver.find_element_by_name()通过name属性定位driver.find_element_by_class_name()通过class属性定位driver.find_element_by_tag_name()通过标签名定位driver.find_element_by_link_text()通过a标签文本定位(全匹配)driver.find_element_by_partial_link_text()通过a标签文本定位(半匹配)driver.find_element_by_xpath()通过xpath定位driver.find_element_by_css_selector()通过css定位

说明: 以上的方法都是单元素定位,若定位不到则抛异常。如果多元素定位,就是把element变成elements,若匹配不到则返回空列表

5.Selenium的使用 5.1 常用属性和方法 属性说明driver.name当前浏览器名driver.title当前网页标题driver.current_url当前网页的urldriver.page_source当前网页源码 方法说明driver.get()打开某个urldriver.close()关掉当前窗口driver.quit()关掉浏览器driver.back()driver.forward()历史向前、历史后退driver.refresh()刷新页面driver.maximize_window()driver.minimize_window()浏览器最大化、最小化driver.fullscreen_window()浏览器全屏driver.implicitly_wait()隐式等待driver.get_screenshot_as_file()截图保存driver.execute_script()执行js代码 from selenium.webdriver import Firefox import time# driver = Firefox(executable_path=r"D:\kaifa\Python\Python36\geckodriver.exe") # 指定driver所在路径 driver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com") # 打开百度time.sleep(2)print(driver.name) # 打印输出:firefox print(driver.title) # 打印输出:百度一下,你就知道driver.maximize_window() # 最大化窗口 driver.get_screenshot_as_file("baidu.png") # 截图保存driver.quit() # 退出浏览器 5.2 元素等待

如果存在网络不畅、资源受限等因素导致页面不能及时更新,代码可能不能按照预期的步骤执行(比如说定位不到某些元素),可以设置等待

等待又分为显式等待和隐式等待

显式等待

import traceback from selenium.webdriver import Firefox from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWaitdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com")def find_w_element(by=By.ID, value=None, _t=10):wait_driver = WebDriverWait(driver, _t)el = wait_driver.until(lambda temp: temp.find_element(by, value))return eldef find_w_element_by_xpath(xpath, _t=10):wait_driver = WebDriverWait(driver, _t)el = wait_driver.until(lambda temp: temp.find_element_by_xpath(xpath))return eltry:el = find_w_element(By.ID, "username") # 没有此id为username的元素,等待不到会报错print(el) except Exception as e:print(traceback.format_exc()) finally:driver.quit()

隐式等待

import traceback from selenium.webdriver import Firefoxdriver = Firefox() driver.implicitly_wait(10) # 隐式等待时间 driver.get("https://www.baidu.com") try:driver.find_element_by_id("username") except Exception as e:print(e)print(traceback.format_exc()) finally:driver.quit()

隐式等待虽然设置简单,但是它会等待所有元素加载完成,所以效率没有显式等待高,显式等待的优缺点与之相反

或者,简单粗暴点,直接使用time.sleep()强制等待

5.3 操作cookie driver.get_cookies() # 获取所有的cookie driver.get_cookie(name) # 获取指定的 cookie driver.delete_cookie(name) # 删除指定的 cookie driver.delete_all_cookies() # 删除所有的 cookie driver.add_cookie(cookie_dict) # 添加一个 cookie from selenium.webdriver import Firefoxdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com")for c in driver.get_cookies():print(f'{c["name"]}==>{c["value"]}')print("=" * 50) driver.add_cookie({"name": "k1", "value": "v1"}) print(driver.get_cookie("k1"))print("=" * 50) driver.delete_cookie("k1") driver.delete_all_cookies() print(driver.get_cookies())driver.quit()

保存并读取cookie

# 保存cookie cookies = driver.get_cookies() with open("my_cookies.txt", "w", encoding="utf-8") as f:f.write(json.dumps(cookies))# 读取cookie with open("my_cookies.txt", "r", encoding="utf-8") as f:cookies = json.loads(f.read())for cookie in cookies:driver.add_cookie(cookie) 5.4 元素操作 操作说明el.click()单击el.send_keys()往输入框输入文本el.clear()清空输入框el.get_attribute()获取标签属性

常用操作(输入、清空、单击)

import time from selenium.webdriver import Firefox, ActionChainsdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com")input_el = driver.find_element_by_id("kw") # 找到输入框 input_el.send_keys("python") # 输入文本 input_el.clear() # 清空内容 input_el.send_keys("仙剑奇侠传")btn_el = driver.find_element_by_id("su") # 找到搜索按钮 btn_el.click() # 单击按钮time.sleep(3) driver.quit()

行为链

import time from selenium.webdriver import Firefox, ActionChains from selenium.webdriver.common.keys import Keysdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.baidu.com")input_el = driver.find_element_by_id("kw") # 找到输入框# 行为链:移动到输入框->单击->按下shift键->按下a键->松开shift键->松开a键 actions = ActionChains(driver) actions.move_to_element(input_el).click().key_down(Keys.SHIFT).key_down('a').key_up(Keys.SHIFT).key_up('a') actions.perform()time.sleep(3) driver.quit()

常用行为

行为说明reset_actions()清空行为链click()鼠标单击click_and_hold()按下鼠标左键不放release()松开鼠标context_click()鼠标右键double_click()鼠标双击send_keys()发送多个键,即输入字符串key_down()按下某个键key_up()松开某个键drag_and_drop()拖动一个元素到另一个元素drag_and_drop_by_offset()拖动一个元素到指定坐标 5.5 切换窗口

有时候在页面中点击了超链接会打开一个新的页面窗口,这个时候我们可以自由在窗口之间进行切换

import time from selenium.webdriver import Firefoxdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get('http://www.baidu.com')driver.find_element_by_link_text('学术').click() time.sleep(2)print(driver.window_handles) # 所有句柄 print(driver.current_window_handle) # 当前句柄driver.switch_to.window(driver.window_handles[0]) print(driver.current_window_handle) time.sleep(2)driver.switch_to.window(driver.window_handles[1]) print(driver.current_window_handle) time.sleep(2)driver.quit() 5.6 切换iframe

如果在页面中遇到frame标签,想要获取frame里面的元素,应该先切换到该frame

import time from selenium.webdriver import Firefoxdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get("https://www.w3school.com.cn/tiy/t.asp?f=html_elements_select")frame = driver.find_element_by_id('iframeResult') driver.switch_to.frame(frame) select = driver.find_element_by_tag_name('select') print(select.get_attribute('innerHTML'))time.sleep(2) driver.quit() 5.7 切换警告框 import timefrom selenium.webdriver import Firefoxdriver = Firefox() # 因为已经添加到环境变量,所以无需指定路径 driver.get('http://www.baidu.com')driver.execute_script("alert('hello')") # 打开警告框 time.sleep(2) alert = driver.switch_to.alert # 切换到警告框 alert.dismiss() # 取消警告框, alert.accept()效果一样driver.quit() 5.8 无头模式 from selenium.webdriver import Firefox from selenium.webdriver.firefox.options import Optionsoptions = Options() options.add_argument("--headless") # 设置无头模式driver = Firefox(firefox_options=options) # 因为已经添加到环境变量,所以无需指定路径driver.get('http://www.baidu.com')driver.get_screenshot_as_file("test.png") print("截图完毕")driver.quit()

以上使用的Firefox的Options()设置,Chrome或其他浏览器的设置类似,只是导包不一样

5.9 获取HTML源码 # 自带方法 driver.page_source # 获取出来的页面源码可能不是当前的页面 # js方式 html = driver.execute_script("return document.documentElement.outerHTML") 6.性能优化

一般优化都是通过设置一些不必要的配置选项来提高运行效率,例如使用无头模式节省内存、禁用图片加载节省时间等等,可以参考另外一篇文章 【测试】修改selenium选项配置参数优化性能

7.在Linux无界面服务器运行

如果你在服务器运行,那基本上是没有界面的终端,所以我们肯定需要设置无头模式。另外还需要在Linux上安装Chrome以及对应的驱动,由于篇幅较大,我已经把步骤放在另一篇文章 【测试】在Centos7无界面服务器使用selenium

8.反反爬

selenium只是方便用于测试,如果你想当爬虫一样爬取数据,那可能很多网站都已经对它进行了反爬,因为selenium会有一些特征,例如User-Agent等,让服务器判断出不是人为操作 关于反反爬的介绍我也放在另一篇文章 【测试】selenium反爬操作

如果只是想设置User-Agent,可以在options选项操作,例如

from selenium.webdriver import Chrome, ChromeOptionsoptions = ChromeOptions() options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')driver = Chrome(executable_path="F:\webdriver\chromedriver.exe", options=options)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3